#include"mystdio.h"
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>

static MyFile* BuyFile(int fd, int flag)
{
  MyFile* f = (MyFile*)malloc(sizeof(MyFile));
  if(f == NULL) return NULL;
  f->bufferlen = 0;
  f->fileno = fd;
  f->flag = flag;
  f->flush_method = LINE_FLUSH;
  memset(f->outbuffer, 0, sizeof(f->outbuffer));
  return f;
}

MyFile* MyFopen(const char* path, const char* mode)
{
  int fd = -1;
  int flag = 0;
  if(strcmp(mode, "w") == 0)
  {
    flag = O_CREAT | O_WRONLY | O_TRUNC;
    fd = open(path, flag, 0666);
  }
  else if(strcmp(mode, "a") == 0)
  {  
    flag = O_CREAT | O_WRONLY | O_APPEND;
    fd = open(path, flag, 0666);
  }
  else if(strcmp(mode, "r") == 0)
  { 
    flag = O_RDWR;
    fd = open(path, flag, 0666);
  }
  else
  {
    //TODO
  }

  if(fd < 0) return NULL;

  return BuyFile(fd, flag);
}
void MyFclose(MyFile* file)
{
  if(file->fileno < 0) return;
  MyFFlush(file); 
  close(file->fileno);
  free(file);
}
int MyFwrite(MyFile* file, void* str, int len)
{
  // 1.拷贝
  memcpy(file->outbuffer+file->bufferlen, str, len);
  file->bufferlen += len;

  // 2. 尝试判断是否满足刷新条件
  if((file->flush_method & LINE_FLUSH) && file->outbuffer[file->bufferlen-1] == '\n')
  {
    MyFFlush(file);
  }
  return 0;
}
void MyFFlush(MyFile* file)
{
  if(file->bufferlen <= 0) return;
  int n = write(file->fileno, file->outbuffer, file->bufferlen);
  (void)n;
  file->bufferlen = 0;
}

